package dao;

import model.Message;
import utils.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author quan
 * @Description dao表示database access object 数据库访问对象
 * @Date 2023/6/28 19:05
 */

//MessageDao表示Message这个类来访问数据库
public class MessageDao {
    /**
     * 获取所有的留言数据
     * @return 留言集合
     */
    //查询所有的字段
    public List<Message> selectAll(){
        //0、定义访问数据库的相关对象
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        //1、获取数据库连接
        try {
            connection = DBUtil.getConnection();
            //2、定义sql语句
            String sql = "select id,sender,receiver,content from message_wall order by id desc";
            //3、预处理sql语句
            statement = connection.prepareStatement(sql);
            //4、执行sql
            resultSet = statement.executeQuery();//查询用executeQuery，增加删除修改都是返回受影响的行数，用executeUpdate()
            //5、遍历结果集，解析结果
            //定义存放每一行结果的一个集合，每一行都有四个字段
            List<Message> messageList = null;
            while (resultSet.next()){//结果集就是一张表，第一次.next就是第一行，再调用第二行就到第二行...
                //每到一行，就将一行的数据放在一个List集合中
                if(messageList == null){
                    //如果list为空，就进行初始化
                    messageList = new ArrayList<Message>();
                }
                //---------------感觉这里就是：先将4个字段存储到一个message对象中，message的4个属性对应数据库表的四个字段，
                // --------------再将每个message对象存到list集合中，因此List存的都是message对象
                //（1）创建一个Message对象，不断解析结果
                Message message = new Message();
                message.setId(resultSet.getLong(1));//表示第一列
                message.setSender(resultSet.getString(2));
                message.setReceiver(resultSet.getString(3));
                message.setContent(resultSet.getString(4));
                //（2）讲对象添加到集合中
                messageList.add(message);
            }
            //6、返回结果:有的话就打印messageList内容，否则就打印null
            return messageList;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 新增一条留言数据
     * @param message 留言对象
     * @return 受影响的行数
     */
    //往数据库中插入内容
    // int表示受影响的行数
    public int insert(Message message){
        //0、初始化数据源参数
        Connection connection = null;
        PreparedStatement statement = null;
        //1、获取连接
        try {
            connection = DBUtil.getConnection();
            //2、定义sql语句
            String sql = "insert into message_wall values (null,?,?,?)";//?表示占位符
            //3、定义预处理的statement
            statement = connection.prepareStatement(sql);
            //4、处理占位符：将要插入的值(每个字段名)存在message对象的对应属性中
            statement.setString(1,message.getSender());//将message下的sender属性给第一个？值
            statement.setString(2,message.getReceiver());
            statement.setString(3, message.getContent());
            //5、执行sql
            int row = statement.executeUpdate();
            return row;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //6、关闭连接
            DBUtil.close(null,statement,connection);
        }
    return -1;
    }
}
